<template>
	<view>
		<!-- 选择收货地址的盒子 要么显示这个-->
		<view class="address-choose-box" v-if="JSON.stringify(address) === '{}'">
			<button type="primary" size="mini" class="btnChooseAddress" @click="chooseAddress">请选择收货地址+</button>
		</view>

		<!-- 渲染收货信息的盒子 要么显示这个-->
		<view class="address-info-box" v-else @click="chooseAddress">
			<view class="row1">
				<view class="row1-left">
					<view class="username">
						收货人:{{ address.userName }}
						<text></text>
					</view>
				</view>
				<view class="row1-right">
					<view class="phone">
						电话:{{ address.telNumber }}
						<text></text>
					</view>
					<uni-icons type="arrowright" size="16"></uni-icons>
				</view>
			</view>

			<view class="row2">
				<view class="row2-left">收货地址:</view>
				<view class="row2-right">{{ addstr }}</view>
			</view>
		</view>

		<!-- 底部的边框线</view> -->
		<image src="/static/cart_border@2x.png" class="address-border"></image>
	</view>
</template>

<script>
// 1.按需导入mapState,mapMutations两个辅助函数
import { mapState, mapMutations, mapGetters } from 'vuex';

export default {
	name: 'my-address',
	data() {
		return {
			// 2.1注释掉下面的address对象,使用2.2中的代码替代
			// 收货地址
			// address: {}
		};
	},
	computed: {
		// 2.2把m_user模块中的address对象映射当前组件中使用,代替data中adress对象
		...mapState('m_user', ['address']),
		// 将m_user模块中的addstr映射到当前组件中使用
		...mapGetters('m_user', ['addstr'])
	},

	methods: {
		// 3.1把m_user模块中的updateAddress函数映射到当前组件
		...mapMutations('m_user', ['updateAddress']),

		// 选择收货地址
		async chooseAddress() {
			// a.调用小程序提供的chooseAddress()方法,即可使用选择收货地址的功能
			// 返回值是一个数组,第一项为错误对象,第二项为成功后的收货地址对象
			const [err, succ] = await uni.chooseAddress().catch(err => err);
			// console.log(succ);
			//b.用户成功的选择地址
			if (err === null && succ.errMsg === 'chooseAddress:ok') {
				// 3.2把下面这行代码注释掉,使用3.3中的代码替代
				// 为data里面的收货地址对象赋值
				// this.address = succ;
				// console.log(this.address);
				// 3.3使用Store中提供的updateAddress方法,将address保存到Store里面
				this.updateAddress(succ);
			}

			// c.用户没有授权chooseAddress:fail auth deny

			if (err && (err.errMsg === 'chooseAddress:fail auth deny' || err.errMsg === 'chooseAddress:fail authorize no response')) {
			}
			// console.log('需要重新授权');
			this.reAuth();

			// if (
			// 	err &&
			// 	(err.errMsg === 'chooseAddress:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json' ||
			// 		err.errMsg === 'chooseAddress:fail authorize no response')
			// ) {
			// 	console.log('需要重新授权');
			// 	// 调用重新授权申请
			// this.reAuth();
			// }
		},
		// 调用些方法,重新发起收货地址的授权
		async reAuth() {
			// c.1提示用户对地址进行授权
			const [err2, confirmResult] = await uni.showModal({
				content: '检测到您没打开地址权限,是否去设置打开?',
				confirmText: '确认',
				cancelText: '取消'
			});

			// c.2如果弹框异常,则直接退出
			if (err2) return;
			// console.log(confirmResult);
			// c.3如果用户点击了"取消",则提示"您取消了地址授权"
			if (confirmResult.cancel) return uni.$showMsg('您取消了地址授权!');

			// c.4如果用户点击了“确认”，则调用uni.openSetting()方法进入授权页面,让用户重新进行授权
			if (confirmResult.confirm) return console.log('进一步处理');
			uni.openSetting({
				// c.41授权结束,需要对授权进一步判断
				success: settingResult => {
					// openConfirm();
					console.log(settingResult);
					// c.42地址授权的值等于true,提示"授权成功"
					if (settingResult.authSetting['scope.address']) return uni.$showMsg('授权成功!请选择地址');
					// c.43地址授权的值等于false,提示用户"您取消了地址授权"
					if (!settingResult.authSetting['scope.address']) return uni.$showMsg('您取消了地址授权');
				}
			});
		}
	}
};
</script>

<style lang="scss">
.address-choose-box {
	height: 90px;
	display: flex;
	justify-content: center;
	align-items: center;
	.btnChooseAddress {
	}
}
.address-info-box {
	font-size: 12px;
	height: 90px;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 0 5px;
	.row1 {
		display: flex;
		justify-content: space-between;
		.row1-right {
			display: flex;
			justify-content: space-between;
		}
	}
	.row2 {
		display: flex;
		// justify-content: space-between;
		align-items: center;
		margin-top: 10px;
		.row2-left {
			// 不换行
			white-space: nowrap;
		}
		.row2-right {
			margin-left: 5px;
		}
	}
}
.address-border {
	display: block;
	width: 100%;
	height: 5px;
}
</style>
